﻿export function EventBus() { }

let id = 0;
EventBus.prototype.on = function(name, callback) {
  // 如果没有事件对象，新增一个
  if (!this._events) {
    // 创建一个干净的没有原型链的对象
    this._events = Object.create(null);
  }
  // 如果没有这个事件的订阅，新增一个，如果有，设置{id: callback}
  if (!this._events[name]) {
    this._events[name] = {};
  }
  id += 1;
  this._events[name][id] = callback;
  return id;
};
EventBus.prototype.emit = function(name, ...args) {
  // 发布的时候，如果有这个事件，循环执行所有这个订阅的方法
  if (this?._events?.[name]) {
    Object.values(this._events[name]).forEach(callback => {
      callback(...args);
    });
  }
};
EventBus.prototype.off = function(name, cbId) {
  let cbs = this._events[name];
  if (!cbs) {
    return;
  }
  // 如果指定了回调的id，清除对应的回调，否则清除所有订阅
  if (!cbId) {
    delete this._events[name];
  } else {
    delete cbs[cbId];
  }
};
EventBus.prototype.once = function(name, callback) {
  let once = (...args) => {
    callback(...args);
    this.off(name, cbId);
  };
  let cbId = this.on(name, once);
};

export const eventBus = new EventBus();
